home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / dcerpc / printer.py < prev    next >
Text File  |  2006-05-23  |  16KB  |  472 lines

  1. # Copyright (c) 2003-2006 CORE Security Technologies
  2. #
  3. # This software is provided under under a slightly modified version
  4. # of the Apache Software License. See the accompanying LICENSE file
  5. # for more information.
  6. #
  7. # $Id: printer.py,v 1.2 2006/05/23 21:19:26 gera Exp $
  8. #
  9.  
  10. from impacket.structure import Structure
  11.  
  12. def zeroize(s):
  13.     return '\x00'.join(str(s)) + '\x00'
  14.  
  15. class SpoolSS_DevModeContainer(Structure):
  16.     alignment = 4
  17.     structure = (
  18.             ('cbBuf','<L-DevMode'),
  19.             ('pDevMode','<L&DevMode'),
  20.             ('DevMode',':'),
  21.         )
  22.  
  23. class SpoolSS_OpenPrinter(Structure):
  24.     alignment = 4
  25.     opnum = 1
  26.     structure = (
  27.             ('pPrinterName','<L&PrinterName'),
  28.             ('PrinterName','w'),
  29.             # ('pDataType','<L&DataType'),
  30.             ('pDevMode','<L&DevMode'),
  31.             ('DevMode',':',SpoolSS_DevModeContainer),
  32.             ('AccessRequired','<L'),
  33.             ('DataType','w'),
  34.         )
  35.             
  36. class SpoolSS_PrinterInfo1(Structure):
  37.     alignment = 4
  38.     structure = (
  39.             ('level','<L=1'),
  40.             ('_level','<L=1'),
  41.             ('pPrinterInfo1','<L=0x08081200'),
  42.             ('flags','<L'),
  43.             ('pDescription','<L&Description'),
  44.             ('pName','<L&Name'),
  45.             ('pComment','<L&Comment'),
  46.             ('Description','w'),
  47.             ('Name','w'),
  48.             ('Comment','w'),
  49.         )
  50.  
  51. class SpoolSS_PrinterInfo2(Structure):
  52.     alignment = 4
  53.     structure = (
  54.             ('level','<L=2'),
  55.             ('_level','<L=2'),
  56.             ('pPrinterInfo2','<L=0x08081200'),
  57.             ('pServerName', '<L&ServerName'),
  58.             ('pPrinterName', '<L&PrinterName'),
  59.             ('pShareName', '<L&ShareName'),
  60.             ('pPortName', '<L&PortName'),
  61.             ('pDriverName', '<L&DriverName'),
  62.             ('pComment', '<L&Comment'),
  63.             ('pLocation', '<L&Location'),
  64.             ('pDevMode', '<L&DevMode'),
  65.             ('pSepFile', '<L&SepFile'),
  66.             ('pPrintProcessor', '<L&PrintProcessor'),
  67.             ('pDatatype', '<L&Datatype'),
  68.             ('pParameters', '<L&Parameters'),
  69.             ('pSecurityDescriptor', '<L&SecurityDescriptor'),
  70.             ('Attributes', '<L=0'),
  71.             ('Priority', '<L=0'),
  72.             ('DefaultPriority', '<L=0'),
  73.             ('StartTime', '<L=0'),
  74.             ('UntilTime', '<L=0'),
  75.             ('Status', '<L=0'),
  76.             ('cjobs', '<L=0'),
  77.             ('AveragePPM', '<L=0'),
  78.             ('ServerName', 'w'),
  79.             ('PrinterName', 'w'),
  80.             ('ShareName', 'w'),
  81.             ('PortName', 'w'),
  82.             ('DriverName', 'w'),
  83.             ('Comment', 'w'),
  84.             ('Location', 'w'),
  85.             ('DevMode', ':'),
  86.             ('SepFile', 'w'),
  87.             ('PrintProcessor', 'w'),
  88.             ('Datatype', 'w'),
  89.             ('Parameters', 'w'),
  90.             ('SecurityDescriptor', ':'),
  91.             )
  92.  
  93. class SpoolSS_AddPrinter(Structure):
  94.     # opnum from http://bob.marlboro.edu/~msie/2003/it1/tools/ethereal/ethereal-0.9.7/packet-dcerpc-spoolss.h
  95.     opnum = 5
  96.     alignment = 4
  97.     structure = (
  98.             ('pName','<L&Name'),
  99.             ('Name','w'),
  100.             ('info',':',SpoolSS_PrinterInfo2),
  101.             ('blob',':'),
  102.     )
  103.  
  104. class SpoolSS_DeletePrinter(Structure):
  105.     opnum = 6
  106.     alignment = 4
  107.     structure = (
  108.             ('handle','<L'),
  109.     )
  110.  
  111. class SpoolSS_AddPrinterEx(Structure):
  112.     opnum = 0x46
  113.     alignment = 4
  114.     structure = (
  115.             ('pName','<L=0x12345678'),
  116.             ('Name','w'),
  117.             ('info',':',SpoolSS_PrinterInfo2),
  118.             ('blob',':'),
  119.     )
  120.  
  121. class SpoolSS_EnumPrinters(Structure):
  122.     opnum = 0
  123.     alignment = 4
  124.     structure = (
  125.             ('flags','<L'),
  126.             ('pName','<L&Name'),
  127.             ('Name','w'),
  128.             ('level','<L'),
  129.             ('pPrinterEnum','<L&PrinterEnum'),
  130.             ('_cbBuf','<L-PrinterEnum'),
  131.             ('PrinterEnum',':'),
  132.             ('cbBuf','<L-PrinterEnum'),
  133.         )
  134.  
  135. class SpoolSS_EnumPrinters_answer(Structure):
  136.     alignment = 4
  137.     structure = (
  138.             ('pPrinterEnum','<L&PrinterEnum'),
  139.             ('cbPrinterEnum','<L-PrinterEnum'),
  140.             ('PrinterEnum',':'),
  141.             ('cbNeeded','<L'),
  142.             ('cReturned','<L'),
  143.         )
  144.  
  145. class SpoolSS_EnumPorts(Structure):
  146.     # fields order (in the wire) from:
  147.     # http://samba.vernstok.nl/docs/htmldocs/manpages-4/pidl.1.html
  148.     opnum = 0x23
  149.     alignment = 4
  150.     structure = (
  151.             ('pName','<L&Name'),
  152.             ('Name','w'),
  153.             ('level','<L'),
  154.             ('pPort','<L&Port'),
  155.             ('_cbBuf','<L-Port'),
  156.             ('Port',':'),
  157.             ('cbBuf','<L-Port'),
  158.         )
  159.  
  160. class SpoolSS_EnumPorts_answer(Structure):
  161.     alignment = 4
  162.     structure = (
  163.             ('pPort','<L&Port'),
  164.             ('cbPort','<L-Port'),
  165.             ('Port',':'),
  166.             ('cbNeeded','<L'),
  167.             ('cReturned','<L'),
  168.         )
  169.  
  170. class SpoolSS_AddPort(Structure):
  171.     opnum = 37
  172.     alignment = 4
  173.     structure = (
  174.             ('pName','<L&Name'),
  175.             ('Name','w'),
  176.             ('hWnd','<L'),
  177.             ('pMonitorName','<L&MonitorName'),
  178.             ('MonitorName','w'),
  179.         )
  180.  
  181. class SpoolSS_PortInfo1(Structure):
  182.     alignment = 4
  183.     structure = (
  184.             ('level','<L=1'),
  185.             ('_level','<L=1'),
  186.             ('pPortInfo1','<L=0x08081200'),
  187.             ('pName','<L&Name'),
  188.             ('Name','w'),
  189.         )
  190.  
  191. class SpoolSS_AddPortEx(Structure):
  192.     opnum = 61
  193.     alignment = 4
  194.     structure = (
  195.             ('pName','<L&Name'),
  196.             ('Name','w'),
  197.             ('Port',':',SpoolSS_PortInfo1),
  198.             ('cbMonitorData','<L-MonitorData'),
  199.             ('MonitorData',':'),
  200.             # ('pMonitorName','<L&MonitorName'),
  201.             ('MonitorName','w'),
  202.         )
  203.  
  204. class SpoolSS_AddPrintProcessor(Structure):
  205.     opnum = 14
  206.     alignment = 4
  207.     structure = (
  208.             ('pName','<L&Name'),
  209.             ('Name','w'),
  210.             ('pEnvironment','<L&Environment'),
  211.             ('pPathName','<L&PathName'),
  212.             ('pPrintProcessorName','<L&PrintProcessorName'),
  213.             ('Environment','w'),
  214.             ('PathName','w'),
  215.             ('PrintProcessorName','w'),
  216.         )
  217.  
  218. class SpoolSS_EnumMonitors(Structure):
  219.     # fields order (in the wire) from:
  220.     # http://samba.vernstok.nl/docs/htmldocs/manpages-4/pidl.1.html
  221.     opnum = 0x24
  222.     alignment = 4
  223.     structure = (
  224.             ('pName','<L&Name'),
  225.             ('Name','w'),
  226.             ('level','<L'),
  227.             ('pMonitor','<L&Monitor'),
  228.             ('_cbBuf','<L-Monitor'),
  229.             ('Monitor',':'),
  230.             ('cbBuf','<L-Monitor'),
  231.         )
  232.  
  233. class SpoolSS_AddMonitor(Structure):
  234.     # fields order (in the wire) from:
  235.     # http://samba.vernstok.nl/docs/htmldocs/manpages-4/pidl.1.html
  236.     opnum = 0x2e
  237.     alignment = 4
  238.     structure = (
  239.             ('pHostName','<L&HostName'),
  240.             ('HostName','w'),
  241.             ('level','<L'),
  242.             ('level','<L'),
  243.             ('pLevel','<L&level'),
  244.             ('pName','<L&Name'),
  245.             ('pEnvironment','<L&Environment'),
  246.             ('pDLLName','<L&DLLName'),
  247.             ('Name','w'),
  248.             ('Environment','w'),
  249.             ('DLLName','w'),
  250.         )
  251.  
  252. class SpoolSS_EnumMonitors_answer(Structure):
  253.     alignment = 4
  254.     structure = (
  255.             ('pMonitor','<L&Monitor'),
  256.             ('cbMonitor','<L-Monitor'),
  257.             ('Monitor',':'),
  258.             ('cbNeeded','<L'),
  259.             ('cReturned','<L'),
  260.         )
  261.  
  262. PRINTER_ENUM_DEFAULT     = 0x00000001
  263. PRINTER_ENUM_LOCAL       = 0x00000002
  264. PRINTER_ENUM_CONNECTIONS = 0x00000004
  265. PRINTER_ENUM_FAVORITE    = 0x00000004
  266. PRINTER_ENUM_NAME        = 0x00000008
  267. PRINTER_ENUM_REMOTE      = 0x00000010
  268. PRINTER_ENUM_SHARED      = 0x00000020
  269. PRINTER_ENUM_NETWORK     = 0x00000040
  270.  
  271. class PrintSpooler:
  272.     def __init__(self, dce):
  273.         self.dce = dce
  274.  
  275.     def doRequest(self, request, noAnswer = 0, checkReturn = 1):
  276.         self.dce.call(request.opnum, request)
  277.         if noAnswer:
  278.             return
  279.         else:
  280.             answer = self.dce.recv()
  281.             if checkReturn and answer[-4:] != '\x00\x00\x00\x00':
  282.                 raise Exception, 'DCE-RPC call returned an error.'
  283.             return answer
  284.     
  285.     def enumPrinters(self, name, flags = 0, level = 1):
  286.         # first get the number of bytes needed
  287.         enumPrinters = SpoolSS_EnumPrinters()
  288.         enumPrinters['level'] = level
  289.         enumPrinters['flags'] = flags
  290.         enumPrinters['Name'] = name
  291.         enumPrinters['PrinterEnum'] = ''
  292.         ans = SpoolSS_EnumPrinters_answer(self.doRequest(enumPrinters, checkReturn = 0))
  293.  
  294.         self.logDebug("enumPrinters() needing %d bytes" % ans['cbNeeded'])
  295.         if ans['cbNeeded'] > 4096:
  296.             raise Exception, "Buffer is too big."
  297.  
  298.         # do the real request
  299.         enumPrinters = SpoolSS_EnumPrinters()
  300.         enumPrinters['level'] = level
  301.         enumPrinters['flags'] = flags
  302.         enumPrinters['Name'] = name
  303.         enumPrinters['PrinterEnum'] = '\x00' * ans['cbNeeded']
  304.  
  305.         ans = SpoolSS_EnumPrinters_answer(self.doRequest(enumPrinters, checkReturn = 0))
  306.         # ans.dump('answer')
  307.         
  308.     def openPrinter(self, printerName, dataType, devMode, accessRequired):
  309.         openPrinter = SpoolSS_OpenPrinter()
  310.         if printerName: openPrinter['PrinterName'] = zeroize(printerName+'\x00')
  311.         if dataType:    openPrinter['DataType']    = zeroize(dataType+'\x00')
  312.         if devMode:
  313.             devModeC = SpoolSS_DevModeContainer()
  314.             # devModeC['DevMode'] = devModeC
  315.             devModeC['cbBuf'] = 0
  316.             devModeC['pDevMode'] = 0
  317.             devModeC['DevMode'] = ''
  318.             openPrinter['DevMode'] = '\x00\x00\x00\x00'
  319.             openPrinter['pDevMode'] = 0
  320.         openPrinter['AccessRequired'] = accessRequired
  321.  
  322.         return self.doRequest(openPrinter, checkReturn = 0)
  323.  
  324.     def enumPorts(self, level = 1, noAnswer = 0):
  325.         # this one calls ntdll_RtlAcquirePebLock and ntdll_RtlReleasePebLock
  326.  
  327.         # first get the number of bytes needed
  328.         enumPorts = SpoolSS_EnumPorts()
  329.         enumPorts['level'] = level
  330.         enumPorts['Port'] = ''
  331.         if noAnswer:
  332.             self.doRequest(enumPorts, noAnswer = 1)
  333.         else:
  334.             ans = SpoolSS_EnumPorts_answer(self.doRequest(enumPorts, checkReturn = 0))
  335.  
  336.             # do the real request
  337.             enumPorts = SpoolSS_EnumPorts()
  338.             # enumPorts['Name'] = '\\\x00\\\x00hola\x00\x00'
  339.             enumPorts['level'] = level
  340.             enumPorts['Port'] = '\x00'*ans['cbNeeded']
  341.             ans = SpoolSS_EnumPorts_answer(self.doRequest(enumPorts, checkReturn = 0))
  342.             # ans.dump('answer')
  343.         
  344.     def enumMonitors(self, level = 1):
  345.         # first get the number of bytes needed
  346.         enumMonitors = SpoolSS_EnumMonitors()
  347.         enumMonitors['level'] = level
  348.         enumMonitors['Monitor'] = ''
  349.         ans = SpoolSS_EnumMonitors_answer(self.doRequest(enumMonitors, checkReturn = 0))
  350.  
  351.         # do the real request
  352.         enumMonitors = SpoolSS_EnumMonitors()
  353.         # enumMonitors['Name'] = '\\\x00\\\x00hola\x00\x00'
  354.         enumMonitors['level'] = level
  355.         enumMonitors['Monitor'] = '\x00'*ans['cbNeeded']
  356.         ans = SpoolSS_EnumMonitors_answer(self.doRequest(enumMonitors, checkReturn = 0))
  357.         # ans.dump('answer')
  358.         
  359.     def addMonitor(self, name, monitorName, environment, dllName):
  360.         addMonitor = SpoolSS_AddMonitor()
  361.         addMonitor['level'] = 2
  362.         addMonitor['HostName'] = zeroize(name)
  363.         addMonitor['Name'] = zeroize(monitorName) 
  364.         addMonitor['Environment'] = zeroize(environment) 
  365.         addMonitor['DLLName'] = zeroize(dllName) 
  366.         ans = self.doRequest(addMonitor, checkReturn = 0)
  367.         print "%r" % ans
  368.         
  369.     def addPort(self):
  370.         addPort = SpoolSS_AddPort()
  371.         addPort['Name'] = zeroize('\\192.168.22.90\x00')
  372.         addPort['hWnd'] = 0
  373.         addPort['MonitorName'] = zeroize('LanMan Print Services Port\x00')
  374.  
  375.         return self.doRequest(addPort)
  376.  
  377.     def addPortEx(self):
  378.         port = SpoolSS_PortInfo1()
  379.         port['Name'] = zeroize('Port Name\x00')
  380.  
  381.         addPortEx = SpoolSS_AddPortEx()
  382.         addPortEx['Name'] = zeroize('\\\\192.168.22.90\x00')
  383.         addPortEx['Port'] = port
  384.         addPortEx['cbMonitorData'] = 0
  385.         addPortEx['MonitorData'] = '\x00'*4
  386.         addPortEx['MonitorName'] = zeroize('Monitor Name\x00')
  387.  
  388.         return self.doRequest(addPortEx)
  389.  
  390.     def addPrintProcessor(self):
  391.         addPrintProcessor = SpoolSS_AddPrintProcessor()
  392.         # addPrintProcessor['Name'] = zeroize('\\\\192.168.22.90\x00')
  393.         addPrintProcessor['Environment'] = zeroize('Windows NT x86\x00')
  394.         addPrintProcessor['PathName'] = zeroize('C:\\hola\\manola\x00')
  395.         addPrintProcessor['PrintProcessorName'] = zeroize('chaucha\x00')
  396.  
  397.         return self.doRequest(addPrintProcessor)
  398.  
  399.     def deletePrinter(self, handle):
  400.         deletePrinter = SpoolSS_DeletePrinter()
  401.         deletePrinter['handle'] = handle
  402.         self.doRequest(deletePrinter)
  403.  
  404.     def addPrinter(self, serverName, name, level = 1, flags = 0, comment = None, description = None):
  405.         addPrinter = SpoolSS_AddPrinter()
  406.         # length(Name)+length(PrinterName)+2+2 must be the size of the chunk following the overflown
  407.  
  408.         if serverName is not None:
  409.             addPrinter['Name'] = serverName
  410.  
  411.         if level == 1:
  412.                 addPrinter['info'] = SpoolSS_PrinterInfo1()
  413.                 addPrinter['info']['Name'] = name
  414.                 addPrinter['info']['Description'] = description
  415.                 addPrinter['info']['flags'] = flags
  416.         elif level == 2:
  417.             addPrinter['info'] = SpoolSS_PrinterInfo2()
  418.             addPrinter['info']['PrinterName'] = name
  419.         else: 
  420.             raise Exception, "Unknown PRINTER_INFO level"
  421.  
  422.         addPrinter['info']['Comment'] = comment
  423.  
  424.         addPrinter['blob'] = (                # to be improved
  425.                 "\x00\x00\x00\x00"*4
  426.                 )
  427.  
  428.         # addPrinter.dump('addPrinter')
  429.         # addPrinter['info'].dump('info')
  430.         return self.doRequest(addPrinter, checkReturn = 0)
  431.  
  432.     def addPrinterEx(self, serverName, name, comment = None):
  433.         addPrinterEx = SpoolSS_AddPrinterEx()
  434.  
  435.         # length(Name)+length(PrinterName)+2+2 must be the size of the chunk following the overflow in mem
  436.  
  437.         addPrinterEx['Name'] = serverName
  438.  
  439.         addPrinterEx['info'] = SpoolSS_PrinterInfo2()
  440.         addPrinterEx['info']['PrinterName'] = name
  441.         addPrinterEx['info']['Comment'] = comment
  442.  
  443.         addPrinterEx['blob'] = (                # to be improved
  444.                 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  445.                 "\x01\x00\x00\x00\x01\x00\x00\x00"
  446.  
  447.                 "\xf8\xf3\x30\x00"
  448.                 "\x1c\x00\x00\x00"
  449.                 "\xf0\x62\xc9\x00"
  450.                 "\xe0\xf1\x30\x00"
  451.                 "\x93\x08\x00\x00"
  452.                 "\x03\x00\x00\x00"
  453.                 "\x00\x00\x00\x00"
  454.                 "\x00\x00\x00\x00"
  455.  
  456.                 "\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00"
  457.  
  458.                 # \\ERATO
  459.                 "\x5c\x00\x5c\x00\x45\x00\x52\x00\x41\x00\x54\x00\x4f\x00\x00\x00"
  460.  
  461.                 "\x0e\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00"
  462.  
  463.                 # Administrator
  464.                 "\x41\x00\x64\x00\x6d\x00\x69\x00\x6e\x00\x69\x00\x73\x00\x74\x00"
  465.                 "\x72\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x00\x00"
  466.             )
  467.  
  468.         return self.doRequest(addPrinterEx)
  469.  
  470.  
  471.  
  472.